/**
 * Fichier Interface.java : Définition de classe fr.unice.gnpt.gui.Interface :
 * Interface graphique
 * 
 * Auteurs : Groupe GNPT : Gastinel, Nicolas, Pellegrino, Trovato
 */
package fr.unice.gnpt.gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;

import net.miginfocom.layout.CC;
import net.miginfocom.swing.MigLayout;
import fr.unice.gnpt.Main;
import fr.unice.gnpt.gui.listeners.InterfaceListener;
import fr.unice.gnpt.gui.util.TypeUtilisateur;
import fr.unice.gnpt.gui.utilisateur.UtilCoordonateur;
import fr.unice.gnpt.gui.utilisateur.UtilEnseignant;
import fr.unice.gnpt.gui.utilisateur.Utilisateur;

/**
 * Classe de l'interface graphique.
 * <p>
 * Cette classe permet de lancer l'interface graphique principale. Il suffit
 * d'utiliser le constructeur {@code Interface()} pour lancer le mode graphique.
 * 
 * @author gnpt
 * @version 0.0.4
 */
public class Interface extends JFrame {
	private static final long serialVersionUID = 1L;

	/**
	 * Jlabel contenant l'état de l'application, affiché en bas de celle-ci.
	 */
	private JLabel status = new JLabel("");
	/**
	 * Lien vers la gestion des événements.
	 */
	private InterfaceListener listener = new InterfaceListener(this);
	/**
	 * Type d'utilisateur de l'application.
	 */
	private TypeUtilisateur typeUtilisateur;
	/**
	 * Interface associée au typeUtilisateur.
	 */
	private Utilisateur utilisateur;
	/**
	 * Les différents onglets de l'application pour séparer les enseignements,
	 * tâches administratives, enseignements libres, statistiques enseignants,
	 * etc.
	 */
	private JTabbedPane tabs;

	/**
	 * Création et affichage de l'interface graphique avec une boîte de dialoque
	 * pour permettre à l'utilisateur de configurer la connexion à la base de
	 * données.
	 */
	public Interface() {
		super("EducationManager");
	}

	/**
	 * Initialise et affiche l'interface graphique générale de
	 * l'EducationManager.
	 * 
	 * @param tUtilisateur
	 *            type de l'utilisateur de l'application.
	 */
	public void creerEtAfficher(TypeUtilisateur tUtilisateur) {
		this.setTypeUtilisateur(tUtilisateur);
		this.setDefaultCloseOperation(HIDE_ON_CLOSE);
		this.addWindowListener(this.getListener());

		switch (this.getTypeUtilisateur()) {
		case COORDONNATEUR:
			this.utilisateur = new UtilCoordonateur(this);
			break;
		case ENSEIGNANT:
			this.utilisateur = new UtilEnseignant(this);
			((UtilEnseignant) this.utilisateur).identification();
			break;
		}

		this.utilisateur.setListener(this.listener);

		JFrame.setDefaultLookAndFeelDecorated(false);

		// Barre de menu
		this.setJMenuBar(this.creerMenuBarre());

		JPanel panel = new JPanel(new MigLayout("", "[][grow]", "[][grow][]"));

		this.tabs = new JTabbedPane();
		this.tabs.add("Enseignements", this.utilisateur.getContenuEns());
		this.tabs.add("Tâches administratives", this.utilisateur
				.getContenuTachesAdmin());
		this.tabs.add("Enseignements libres", this.utilisateur
				.getContenuEnsDispo());
		this.tabs.add("Statistiques enseignants", this.utilisateur
				.getContenuEnseignantHSup());
		this.tabs.addChangeListener(this.listener);

		JPanel p = new JPanel(new MigLayout("", "[grow,fill]", "[grow,fill]"));
		p.add(this.tabs, "wrap");
		p.add(this.getUtilisateur().getInformations(), "dock south");

		// Contenu
		JSplitPane jsplitpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
				this.utilisateur.getCadreGauche(), p);
		jsplitpane.setDividerLocation(230);
		jsplitpane.setOneTouchExpandable(true);
		panel.add(jsplitpane, new CC().wrap().width("100%").height("100%"));
		jsplitpane.getLeftComponent().setMaximumSize(new Dimension(100, 0));
		jsplitpane.getRightComponent().setMinimumSize(
				new Dimension((int) ((Toolkit.getDefaultToolkit()
						.getScreenSize().getWidth() * 3 / 4) - 270), 0));
		// Barre d'état
		this.status.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0,
				Color.GRAY));

		panel.add(this.status, new CC().dockSouth().width("100%"));

		this.add(panel);

		Dimension resolutionEcran = Toolkit.getDefaultToolkit().getScreenSize();
		Dimension bonnesProportions = new Dimension((int) (resolutionEcran
				.getWidth() * 5 / 6),
				(int) (resolutionEcran.getHeight() * 5 / 6));
		this.setMinimumSize(bonnesProportions);
		this.pack();
		this.setLocationRelativeTo(null);
		this.setVisible(true);

		this.setStatus("Mode " + this.utilisateur);
	}

	/**
	 * Accesseur pour le gestionnaire d'onglets.
	 * 
	 * @return le tabbedPane.
	 */
	public JTabbedPane getTabs() {
		return this.tabs;
	}

	/**
	 * Génération de la barre de menu associé aux fonctionnalités du programme.
	 * 
	 * @return la barre de menu.
	 */
	private JMenuBar creerMenuBarre() {
		JMenuBar menubar = new JMenuBar();
		JMenu menu;
		JMenuItem item;
		JMenuItem changerUtil;

		// ----> Fichier
		// Fonction : Quitter
		item = new JMenuItem("Quitter", KeyEvent.VK_Q);
		item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
				ActionEvent.CTRL_MASK));
		item.setActionCommand("quitter");
		item.addActionListener(this.listener);
		// ----> Fichier
		// Fonction : Changer Utilisateur
		changerUtil = new JMenuItem("Changer d'utilisateur", KeyEvent.VK_C);
		changerUtil.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
				ActionEvent.CTRL_MASK));
		changerUtil.setActionCommand("changerUtil");
		changerUtil.addActionListener(this.listener);

		// Menu 'Fichier'
		menu = new JMenu("Fichier");
		menu.setMnemonic(KeyEvent.VK_F);
		if (this.typeUtilisateur.equals(TypeUtilisateur.ENSEIGNANT)) {
			menu.add(changerUtil);
			menu.addSeparator();
		}
		menu.add(item);
		// Ajout de 'Fichier'
		menubar.add(menu);

		// ----> Aide
		// Menu 'Aide'
		menu = new JMenu("Aide");
		menu.setMnemonic(KeyEvent.VK_A);
		menubar.add(menu);

		// Fonction : 'Licence'
		item = new JMenuItem("Licence");
		item.setMnemonic(KeyEvent.VK_L);
		item.addActionListener(this.listener);
		item.setActionCommand("licence");
		menu.add(item);

		menu.addSeparator();

		// Fonction : 'A propos'
		item = new JMenuItem("A propos");
		item.setMnemonic(KeyEvent.VK_A);
		item.setActionCommand("apropos");
		item.addActionListener(this.listener);
		// Ajout de 'A propos'
		menu.add(item);

		return menubar;
	}

	/**
	 * Affecte une nouvelle information à inscrire dans la barre d'état.
	 * 
	 * @param status
	 *            le nouveau status.
	 */
	public void setStatus(String status) {
		this.status.setText(" " + status);
	}

	/**
	 * Retour la valeur de la barre d'état.
	 * 
	 * @return le status.
	 */
	public String getStatus() {
		return this.status.getText();
	}

	/**
	 * Changer le type d'utilisateur courant.
	 * 
	 * @param utilisateur
	 *            le nouveau utilisateur.
	 */
	public void setTypeUtilisateur(TypeUtilisateur utilisateur) {
		this.typeUtilisateur = utilisateur;
	}

	/**
	 * Retourne le type d'utilisateur courant.
	 * 
	 * @return le type utilisateur
	 */
	public TypeUtilisateur getTypeUtilisateur() {
		return this.typeUtilisateur;
	}

	/**
	 * Ferme proprement l'application.
	 */
	public void quitter() {
		Main.exit(0);
	}

	/**
	 * Accesseur pour l'utilisateur en cours.
	 * 
	 * @return l'utilisateur en cours.
	 */
	public Utilisateur getUtilisateur() {
		return this.utilisateur;
	}

	/**
	 * Dégrise le bouton ajouter.
	 */
	public void validerBoutonAjout() {
		this.getUtilisateur().validerBoutonAjout();
	}

	/**
	 * Met à jour les informations de la table.
	 */
	public void rafraichir() {
		this.utilisateur.rafraichir();
		this.setStatus("");
	}

	/**
	 * Activation du filtre de recherche.
	 */
	public void rechercher() {
		if (this.utilisateur.rechercher() > 0) {
			// Si on est pas sur l'onglet des enseignements
			// on se remet immédiatement dessus
			if (this.getTabs().getSelectedIndex() > 1) {
				this.setStatus("Filtre activé");
				this.getTabs().setSelectedIndex(0);
			}
		}
	}

	/**
	 * Active la validation du service séléctionné.
	 */
	public void activeValiderService() {
		this.getUtilisateur().setGestionEnabled(false);
		this.getUtilisateur().setGestionDispoEnabled(false);

		int ongletCourant = this.getTabs().getSelectedIndex();

		switch (ongletCourant) {
		case 0:
			this.getUtilisateur().activeGestionEns();
			break;
		case 1:
			this.getUtilisateur().activeGestionTAdmin();
			break;
		case 2:
			this.getUtilisateur().activeGestionDispo();
			break;
		default:
			break;
		}
	}

	/**
	 * Valide le service séléctionné.
	 */
	public void valideService() {
		int onglet = this.tabs.getSelectedIndex();

		if (onglet == 0) {
			this.getUtilisateur().gereEns();
		} else if (onglet == 1) {
			this.getUtilisateur().gereTAdmin();
		}
	}

	/**
	 * Accesseur pour l'écouteur associé à l'interface.
	 * 
	 * @return l'écouteur associé à l'interface.
	 */
	public InterfaceListener getListener() {
		return this.listener;
	}
}